package com.demo.agent;

import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;

import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.IllegalClassFormatException;
import java.security.ProtectionDomain;

/**
 * 在类字节码载入 JVM 前，JVM 会调用 ClassFileTransformer.transform 方法，从而实现对类定义进行操作修改，
 * 实现 AOP 功能；相对于 JDK  动态代理、CGLIB 等 AOP 实现技术，不会生成新类，也不需要原类有接口；
 *
 * @author xia_xun
 */
public class TestTransformer implements ClassFileTransformer {
    public final String testClassName = "com.example.demo.DemoApplication";
    public final String methodName = "hello";

    @Override
    public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
        className = className.replace("/", ".");
        if (className.equals(testClassName)) {
            CtClass ctclass;
            try {
                ctclass = ClassPool.getDefault().get(className);
                CtMethod ctmethod = ctclass.getDeclaredMethod(methodName);
                ctmethod.insertBefore("System.out.println(\"方法前，添加打印日志....\");");
                ctmethod.insertAfter("System.out.println(\"方法后，添加打印日志....\");");
                return ctclass.toBytecode();
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
        }
        return null;
    }
}